﻿#region License
// ----------------------------------------------------------------------
// IXcoServiceRegistry.cs
// 
// This file is part of the XcoAppSpace package which is developed 
// and licensed by www.xcoordination.org. 
//
// Copyright (C) 2009: Markus Karolus, Thomas Scheller, Ralf Westphal
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
// or  http://www.gnu.org/licenses/gpl-2.0.html.
//
// Linking this library statically or dynamically with other modules is
// making a combined work based on this library.  Thus, the terms and
// conditions of the GNU General Public License cover the whole
// combination.
// 
// As a special exception, the copyright holders of this library give you
// permission to link this library with independent modules to produce an
// executable, regardless of the license terms of these independent
// modules, and to copy and distribute the resulting executable under
// terms of your choice, provided that you also meet, for each linked
// independent module, the terms and conditions of the license of that
// module.  An independent module is a module which is not derived from
// or based on this library.  If you modify this library, you may extend
// this exception to your version of the library, but you are not
// obligated to do so. If you do not wish to do so, delete this
// exception statement from your version.
// ----------------------------------------------------------------------
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XcoAppSpaces.Contracts.Service
{
	/// <summary>
	/// The service registry contains all services of a space instance and can initialize, start and stop
	/// its services.
	/// </summary>
	public interface IXcoServiceRegistry : IDisposable
	{
		/// <summary>
		/// Gets the service with the given type from the registry.
		/// </summary>
		/// <typeparam name="T">The type of the service.</typeparam>
		/// <returns>The resolved service instance, or null if no instance could be found.</returns>
		T Resolve<T>() where T : IXcoService;

		/// <summary>
		/// Gets the service with the given type and name from the registry.
		/// </summary>
		/// <typeparam name="T">The type of the service.</typeparam>
		/// <param name="name">The name of the service.</param>
		/// <returns>The resolved service instance, or null if no instance could be found.</returns>
		T Resolve<T>(string name) where T : IXcoService;

		/// <summary>
		/// Gets all services with the given type from the registry.
		/// </summary>
		/// <typeparam name="T">The type of the service.</typeparam>
		/// <returns>List of all services including their configuration data.</returns>
		List<XcoServiceConfiguration<T>> ResolveAll<T>() where T : IXcoService;

		/// <summary>
		/// Registers a new service at the registry.
		/// </summary>
		/// <typeparam name="T">The type of the service.</typeparam>
		/// <param name="service">The service instance.</param>
		void Register<T>(T service) where T : IXcoService;

		/// <summary>
		/// Registers a new service at the registry.
		/// </summary>
		/// <param name="service">The service to be added.</param>
		void Register(XcoServiceConfiguration service);

		/// <summary>
		/// Initializes all services in the registry, by calling their Initialize methods.
		/// </summary>
		void InitializeServices();

		/// <summary>
		/// Starts all stateful services in the registry by calling their Start methods (in the order 
		/// according to the start priority of the services).
		/// </summary>
		void StartServices();

		/// <summary>
		/// Stops all stateful services in the registry by calling their Stop methods.
		/// </summary>
		void StopServices();

	}
}
